use super::error::{FFIError, FFIResult};

// 安全内存缓冲区包装器
pub struct SafeMemoryBuffer {
    data: Vec<u8>,
}

impl SafeMemoryBuffer {
    // 创建新的安全内存缓冲区
    pub fn new(size: usize) -> FFIResult<Self> {
        let data = vec![0; size];
        Ok(SafeMemoryBuffer {
            data,
        })
    }
    
    // 获取缓冲区大小
    pub fn size(&self) -> usize {
        self.data.len()
    }
    
    // 从切片创建安全内存缓冲区
    pub fn from_slice(slice: &[u8]) -> FFIResult<Self> {
        let mut data = vec![0; slice.len()];
        data.copy_from_slice(slice);
        Ok(SafeMemoryBuffer {
            data,
        })
    }
    
    // 复制到安全内存缓冲区
    pub fn copy_from_slice(&mut self, slice: &[u8]) -> FFIResult<()> {
        if slice.len() > self.data.len() {
            return Err(FFIError::BufferTooSmall);
        }
        
        self.data[..slice.len()].copy_from_slice(slice);
        Ok(())
    }
    
    // 获取缓冲区的不可变切片引用
    pub fn as_slice(&self) -> &[u8] {
        &self.data
    }
    
    // 获取缓冲区的可变切片引用
    pub fn as_mut_slice(&mut self) -> &mut [u8] {
        &mut self.data
    }
    
    // 获取缓冲区数据的指针
    pub fn as_ptr(&self) -> *const u8 {
        self.data.as_ptr()
    }
    
    // 获取缓冲区数据的可变指针
    pub fn as_mut_ptr(&mut self) -> *mut u8 {
        self.data.as_mut_ptr()
    }
    
    // 调整缓冲区大小
    pub fn resize(&mut self, new_size: usize) {
        self.data.resize(new_size, 0);
    }
}